#ifndef __APP_MESSAGE_H__
#define __APP_MESSAGE_H__

#include <unistd.h>

typedef enum
{
    TYPE_NONE,
    TYPE_BT,
    TYPE_LORA
} ConnectionType;

/** 消息是由二进制组成，帧格式为：
 *   1. 消息类型，1字节
 *   2. 消息ID的长度，1字节
 *   3. 消息内容的长度，1字节
 *   4. 消息ID，二进制，长度可变
 *   5. 消息内容，二进制，长度可变
 */
typedef struct
{
    ConnectionType type;
    void *id;
    size_t id_len;
    void *data;
    size_t len;
} Message;

/**
 * @brief 将一个二进制串解析为消息
 *
 * @param data
 * @param len
 * @return Message* 解析完成的消息指针
 */
Message *app_message_initFromBinary(void *data, size_t len);

/**
 * @brief 将一个JSON字符串解析为消息
 *
 * @param json_str
 * @param len
 * @return Message* 解析完成的消息指针
 */
Message *app_message_initFromJson(char *json_str, size_t len);

/**
 * @brief 将一个消息转换为JSON字符串
 *
 * @param msg 要转化的消息
 * @param json_str 输出的JSON字符串
 * @param len 输出的JSON字符串缓冲区总长度
 * @return int 转换后的JSON字符串长度 -1表示失败
 */
int app_message_saveAsJson(Message *msg, char *json_str, size_t len);

/**
 * @brief 将一个消息转换为二进制串
 *
 * @param msg 要转化的消息
 * @param data 输出的二进制串指针
 * @param len 输出的二进制串缓冲区总长度
 * @return int 转换后的二进制串长度 -1表示失败
 */
int app_message_saveAsBinary(Message *msg, void *data, size_t len);

/**
 * @brief 释放一个消息的内存
 *
 * @param msg 要释放的消息指针
 */
void app_message_free(Message *msg);

#endif /* __APP_MESSAGE_H__ */